# -*- coding: utf-8 -*-
# standard
import os
import sys

# third

# local
_P_PATH = os.path.dirname(os.path.realpath(__file__))
if _P_PATH not in sys.path:
    sys.path.append(_P_PATH)
from models import *


"""
@Title:   
@File: 同步指令目录的文件到gpu.py
@Author: walle 2023年11日09日 10时23分17秒
@Version: 1.0.0
@Desc: 
"""



def local_all_videos(local_dir: str = None) -> Tuple[dict, dict]:
    """
    发现本地源目录的所有视频，不与数据库的scp记录进行对比，返回视频名和尺寸组成的数组
    :return: _description_
    """
    local_dir = SOURCE_DIR if local_dir is None else local_dir
    good_files, bad_files = {}, {}
    num = 0
    logger.debug(f"源目录 {local_dir}")
    for file_name in os.listdir(local_dir):
        current_path = os.path.join(local_dir, file_name)
        if file_name.endswith(".mp4") and os.path.isfile(current_path):
            file_size = os.path.getsize(current_path)
            if file_size >= MIN_VIDEO_SIZE * 1024:
                good_files[file_name] = file_size
                num += 1
            else:
                bad_files[file_name] = file_size
        else:
            pass
    logger.debug(f"发现{num}个有效视频")
    return good_files, bad_files


def main(local_dir: str = None):
    local_dir = os.path.join(os.path.dirname(_P_PATH), "work_data") if local_dir is None else local_dir
    remote_good_files, remote_bad_files = view_remote_files()
    local_good_files, local_bad_files = local_all_videos(local_dir)
    # 注意，必须让 hk01 先停止向 hk2 写入，否则正在写入的文件可能因为尺寸太小而被删除，这就会导致hk01向hk02的写入失败
    if len(local_bad_files) > 0:
        logger.debug(f"先清除本地的 {len(local_bad_files)} 个尺寸太小的文件")
        for file_name, file_size in local_bad_files.items():
            file_path = os.path.join(local_dir, file_name)
            os.remove(file_path)
            logger.warning(f"删除文件 {file_path} 尺寸 {file_size / (1024 * 1024)}K")
    if len(local_good_files) > 0:
        logger.debug(f"把本地的 {len(local_bad_files)} 个视频与服务端进行比对")
        num = 0
        total = len(local_good_files)
        for file_name, local_file_size in local_good_files.items():
            num += 1
            remote_file_size = remote_good_files.get(file_name, 0)
            if local_file_size > remote_file_size:
                local_path = os.path.join(local_dir, file_name)
                logger.debug(f"本地文件 {file_name} 比远程服务器上的大 ({local_file_size} > {remote_file_size}), 拷贝")
                result = PutRecordOrm.put_one(src=local_path, save_to_db=True)
            elif local_file_size < remote_file_size:
                logger.debug(f"本地文件 {file_name} 比远程服务器上的小 ({local_file_size} < {remote_file_size}), 放弃")
            else:
                 logger.debug(f"本地文件 {file_name} 和远程服务器上的 ({local_file_size} = {remote_file_size}) 尺寸相等, 忽略")
            if num == 1 or num % 100 == 0 or num == total:
                logger.debug(f"工作进度 {int((num / total) * 100)}%")




if __name__ == '__main__':
    # 目前同步的是 video_backup 备份文件夹
    local_dir = os.path.join(os.path.dirname(_P_PATH), "video_backup")
    main(local_dir)
    pass